﻿// ## 2021/10/01 # 江东新风 # namespace的韩文改成英文 ##
// ## 2020/07/26 ##
namespace AI_ITEM_REWARD
{
	//---------------------------------------------------------------------------------------
	const bool 调试模式 = false;
	const int AWARD_AP_COST = 10;
	//---------------------------------------------------------------------------------------
	class Main
	{
		Main()
		{
			pk::bind(111, pk::trigger111_t(onTurnStart));
		}

		array<array<pk::item@>> force_item_arr(宝物组_末, array<pk::item@>(200,null));
		array<array<pk::person@>> force_person_arr;
		array<array<bool>> person_item_type_arr(武将_末, array<bool>(宝物组_末, false));

		void onTurnStart(pk::force@ force)
		{
			//回合开始更新数据，然后用cmd形式运行？
			if (pk::is_alive(force))
			{
				if (force.is_player())//排除玩家势力
					return;
				int force_id = force.get_id();
				if (pk::is_valid_normal_force_id(force_id))//排除贼势力
				{
					reward_force_item(force_id);
				}					
			}
			return;
		}

		void reward_force_item(int force_id)
		{
			//专门用来分配国库的宝物
			//给自势力的武将能力排个序，然后优先赏赐专属宝物（确认是否冲突？），接着按能力值匹配宝物？已有宝物的先剔除

			//先按宝物分组获取势力宝物并按价值排序，同时会更新武将拥有宝物的列表
			force_item_arr = get_force_treasury_item_arr(force_id);
			//再按能力分组获取势力武将并按能力分别排序
			force_person_arr = get_force_person_arr(force_id);

			//确认是否是专属宝物，如是，则直接授予？
			ExclusiveItem_reward(force_id);

			//非专属宝物分类型授予 
			//马匹 要求：统武智前15
			group_item_reward(宝物组_坐骑, { 武将能力_统率,武将能力_武力,武将能力_智力 }, 15);
			//包括长柄和剑，要求：武前20
			group_item_reward(宝物组_兵刃, { 武将能力_武力 }, 20);

			//道具包括暗器，弓，书籍，兵符 前两者是武力要求，后两者偏向于特技
			//先处理弓和暗器 要求：武力前20
			group_item_reward(宝物组_道具, { 武将能力_武力 }, 20, false, true);
			//再处理书籍和兵符 要求：统武前20且特技不冲突-----可能会存在一些文官系特技的授予异常，但先忽略
			group_item_reward(宝物组_道具, { 武将能力_武力,武将能力_统率 }, 20, true, false);

			//铜雀，跳过
			//玉玺，跳过
			//珍品，君主的授予给忠诚低且属性高的
		}

		//
		void ExclusiveItem_reward(int force_id)
		{
			if (pk::get_scenario().no == 15) return;//暂时排除血色剧本
			for (uint i = 0; i < 宝物组_末; ++i)
			{
				if (force_item_arr[i].length == 0) continue;
				for (uint j = 0; j < force_item_arr[i].length; ++j)
				{
					pk::item@ item = @force_item_arr[i][j];
					int item_id = item.get_id();
					int index = find_专属宝物(item_id);
					if (index != -1)
					{
						for (uint k = 1; k < 专属宝物[index].length; ++k)
						{
							int person_id = 专属宝物[index][k];
							if (!person_item_type_arr[person_id][i])//未拥有对应类型宝物
							{
								auto person = pk::get_person(person_id);
								if (pk::is_alive(person) and person.get_force_id() == force_id)
								{
									item_reward_conduct(item, person, pk::get_building(person.service));
									force_item_arr[i].removeAt(j);//授予完成后就将对应宝物从待授予宝物列表移除
									person_item_type_arr[person_id][i] = true;//将对应武将已拥有宝物情况设为true;
									break;//授予完成同时跳出当前循环
								}
							}						
						}
					}
				}
			}
		}

		//授予符合条件的武将
		void group_item_reward(int group_id, array<int> stat_type, uint top_n, bool check_skill = false, bool duel_relate = false)
		{

			//确认武将是否有对应种类宝物
			for (uint i = 0; i < stat_type.length; i++)//分别遍历能力
			{
				
				int stat = stat_type[i];
				for (int j = 0; j < pk::min(top_n, force_person_arr[stat].length); ++j)//遍历对应能力靠前人员
				{
					if (force_item_arr[group_id].length == 0) break;//每次授予完成后都会删除一个宝物，所以每次循环前再次确认宝物是否还有剩余
					pk::person@ person = @force_person_arr[stat][j];
					int person_id = person.get_id();
					if (!person_item_type_arr[person_id][group_id])//未拥有对应类型宝物
					{
						for (uint k = 0; k < force_item_arr[group_id].length; ++k)
						{
							//满足对应能力靠前且未拥有对应宝物
							auto item = @force_item_arr[group_id][k];
							if (duel_relate)
							{
								if (item.type != 宝物种类_暗器 and item.type != 宝物种类_弓) continue;
							}
							//可以在此处确认特技
							if (check_skill)
							{
								int item_id = item.get_id();
								int skill_id = pk::get_item_skill(item_id);
								if (pk::has_skill(person, skill_id)) continue;//有特技则遍历下个宝物寻找合适宝物
							}
							//下方授予操作可以用授予过程的函数替代
							item_reward_conduct(item, person, pk::get_building(person.service));
							force_item_arr[group_id].removeAt(k);//授予完成后就将对应宝物从待授予宝物列表移除
							person_item_type_arr[person_id][i] = true;//将对应武将已拥有宝物情况设为true;
							break;//一旦授予完成，就跳出循环
						}
						

					}

				}
			}



			////确认武将是否有对应种类宝物
			//for (int i = 0; i < stat_type.length; i++)
			//{
			//	int stat = stat_type[i];
			//	pk::person@ person = @force_person_arr[stat][index];
			//	int person_id = person.get_id();
			//	if (!person_item_type_arr[person_id][group_id])
			//	{
			//		//if (skill_check)
			//		//{
			//		//	int skill_id = pk::get_item_skill();
			//		//	person.has_skill();
			//		//}

			//		return true;
			//	}
			//}
		}

		void item_reward_conduct(pk::item@ item, pk::person@person, pk::building@ base)
		{
			pk::award_cmd_info cmd_award;
			@cmd_award.base = base;
			@cmd_award.target = person;
			@cmd_award.item = item;
			//pk::trace(pk::format("授予宝物前：宝物：{}，初始owner:{},目标武将：{}",pk::decode(pk::get_name(item)),item.owner,pk::decode(pk::get_name(person))));
			pk::command(cmd_award);
			//pk::trace(pk::format("授予宝物后：宝物：{}，当前owner:{},目标武将：{}", pk::decode(pk::get_name(item)), item.owner, pk::decode(pk::get_name(person))));
			//pk::info(pk::format("service:{};base:{}", person.service, pk::decode(pk::get_name(base))));
			auto district = pk::get_district(base.get_district_id());
			pk::add_ap(district, AWARD_AP_COST/2);//行动力补偿
			//pk::set_item_owner(item, person_id, -1);
		}

		bool is_valid_item_id(int item_id)
		{
			if (item_id > -1 and item_id < 扩展宝物_末) return true;
			return false;
		}

		//获取势力国库宝物列表
		array<array<pk::item@>> get_force_treasury_item_arr(int force_id)
		{
			array<array<pk::item@>> arr;
			arr.resize(宝物组_末);
			array<array<bool>> type_arr(武将_末, array<bool>(宝物组_末, false));
			
			for (int i = 0; i < 扩展宝物_末; ++i)
			{
				pk::item@ item = pk::get_item(i);
				if (pk::is_alive(item) and item.status == 宝物状态_登场)
				{
					int owner_force_id = item.owner - 武将_末;
					int group_id = pk::item_type_to_group(item.type);
					if (group_id != -1)//会排除是珍品的情况
					{
						if (owner_force_id == force_id)//确认在己方国库
						{
							arr[group_id].insertLast(item);
						}
						//同时检测下宝物所属武将？
						if (pk::is_valid_person_id(item.owner))
						{
							type_arr[item.owner][group_id] = true;
						}
					}

				}
			}

			for (int i = 0; i < 宝物组_末; ++i)
			{
				if (arr[i].length < 1) continue;
				arr[i].sort(function(a, b) {
					return a.value > b.value;
				});
			}

			if (调试模式)
			{
				pk::trace(pk::decode(pk::get_name(pk::get_force(force_id))) + "国库内宝物：");
				for (int i = 0; i < 宝物组_末; ++i)
				{
					pk::trace(pk::format("类型：{}",i));
					for (uint j = 0; j < arr[i].length; ++j)
					{
						string name = pk::decode(pk::get_name(arr[i][j]));
						pk::trace(name);
					}
				}
			}

			person_item_type_arr = type_arr;//更新全局数据
			return arr;
		}

		//获取自势力武将列表并按能力排序,
		array<array<pk::person@>> get_force_person_arr(int force_id)
		{
			array<pk::person@> arr0;
			array<array<pk::person@>> arr;
			arr.resize(武将能力_末);
			for (int i = 0; i < 非贼武将_末; ++i)
			{
				pk::person@ person = pk::get_person(i);
				if (pk::is_alive(person) and person.get_force_id() == force_id and pk::check_mibun(person,pk::mibun_flags(身份_君主, 身份_都督, 身份_太守, 身份_一般)))
				{
					arr0.insertLast(person);//先获取当前势力所有武将
				}
			}
			if (arr0.length > 1)
			{
				arr0.sort(function(a, b) { return a.stat[武将能力_统率] > b.stat[武将能力_统率]; });
				arr[武将能力_统率] = arr0;
				arr0.sort(function(a, b) { return a.stat[武将能力_武力] > b.stat[武将能力_武力]; });
				arr[武将能力_武力] = arr0;
				arr0.sort(function(a, b) { return a.stat[武将能力_智力] > b.stat[武将能力_智力]; });
				arr[武将能力_智力] = arr0;
				arr0.sort(function(a, b) { return a.stat[武将能力_政治] > b.stat[武将能力_政治]; });
				arr[武将能力_政治] = arr0;
				arr0.sort(function(a, b) { return a.stat[武将能力_魅力] > b.stat[武将能力_魅力]; });
				arr[武将能力_魅力] = arr0;
			}

			return arr;
		}

		//pk::list<pk::item@> get_force_target_item_list(int force_id)
		//{
		//	pk::list<pk::item@> list;
		//	for (int i = 0; i < 扩展宝物_末; ++i)
		//	{
		//		if (is_target_item_id(i))
		//		{
		//			pk::item@ item = pk::get_item(i);
		//			if (item !is null and item.status == 宝物状态_登场 and pk::is_valid_person_id(item.owner))
		//			{
		//				pk::person@ person = pk::get_person(item.owner);
		//				if (person.get_force_id() == force_id)
		//				{
		//					if (check_专属宝物(i, item.owner)) list.add(item);
		//				}
		//			}
		//		}
		//	}
		//	return list;
		//}

		//pk::list<pk::item@> get_force_item_list(int force_id)
		//{
		//	pk::list<pk::item@> list;
		//	for (int i = 0; i < 扩展宝物_末; ++i)
		//	{
		//		if (is_target_item_id(i))
		//		{
		//			pk::item@ item = pk::get_item(i);
		//			if (item !is null and item.status == 宝物状态_登场 and pk::is_valid_person_id(item.owner))
		//			{
		//				pk::person@ person = pk::get_person(item.owner);
		//				if (person.get_force_id() == force_id) list.add(item);
		//			}
		//		}
		//	}
		//	return list;
		//}

		//pk::list<pk::item@> get_person_item_list(int person_id)
		//{
		//	pk::list<pk::item@> list;
		//	for (int i = 0; i < 扩展宝物_末; ++i)
		//	{
		//		if (is_target_item_id(i))
		//		{
		//			pk::item@ item = pk::get_item(i);
		//			if (item !is null and item.status == 宝物状态_登场)
		//			{
		//				if (person_id == item.owner)
		//				{
		//					if (!check_专属宝物(i, item.owner)) list.add(item);
		//				}
		//			}
		//		}
		//	}
		//	return list;
		//}

		bool check_专属宝物(int item_id, int person_id)
		{
			for (uint i = 0; i < 专属宝物.length; ++i)
			{
				if (专属宝物[i][0] == item_id)
				{
					for (uint j = 1; j < 专属宝物[i].length; ++j)
					{
						if (专属宝物[item_id][j] == person_id) return true;
					}
				}			
			}
			return false;
		}

		int find_专属宝物(int item_id)
		{
			for (uint i = 0; i < 专属宝物.length; ++i)
			{
				if (专属宝物[i][0] == item_id)
				{
					return i;
				}
			}
			return -1;
		}
	}

	Main main;
	const array<array<int>> 专属宝物 = {
{宝物_赤兔马, 武将_吕布, 武将_关羽},
{宝物_的卢, 武将_刘备},
{宝物_爪黄飞电, 武将_曹操},
{宝物_绝影, 武将_曹操},
{宝物_大宛马, 武将_王双},
{宝物_七星宝刀, 武将_王允},
{宝物_倚天剑, 武将_曹操},
{宝物_青釭剑, 武将_夏侯恩,武将_赵云},
{宝物_雌雄一对剑, 武将_刘备},
{宝物_方天画戟, 武将_吕布},
{宝物_青龙偃月刀, 武将_关羽},
{宝物_蛇矛, 武将_张飞},
{宝物_流星锤, 武将_王双},
{宝物_飞刀, 武将_祝融},
{宝物_短戟, 武将_典韦},
{宝物_手戟, 武将_太史慈},
{宝物_手戟2, 武将_孙策},
{宝物_铁锁, 武将_甘宁},
{宝物_孙子兵法, 武将_孙坚},
{宝物_兵法二十四篇, 武将_诸葛亮},
{宝物_孟徳新书, 武将_曹操},
{宝物_太平要术, 武将_张角},
{宝物_双铁戟, 武将_典韦},
{宝物_方天戟, 武将_鄂焕},
{宝物_铁脊蛇矛, 武将_程普},
{宝物_三尖刀, 武将_纪灵},
{宝物_大斧, 武将_徐晃},
{宝物_铁鞭, 武将_黄盖},
{宝物_铁锤, 武将_武安国},
{宝物_黄巾军兵符, 武将_张角},
{宝物_东州兵兵符, 武将_李严},
{宝物_陷阵营兵符, 武将_高顺},
{宝物_飞熊兵兵符, 武将_李傕},
{宝物_虎贲虎卫兵符, 武将_许褚},
{宝物_西凉铁骑兵符, 武将_马超},
{宝物_无当飞军兵符, 武将_王平},
{宝物_解烦营兵符, 武将_韩当},
{宝物_先登营兵符, 武将_麹义},
{宝物_大戟士兵符, 武将_张郃},
{宝物_役兽部队兵符, 武将_木鹿大王},
{宝物_元戎弩兵兵符, 武将_诸葛亮},
{宝物_丹阳兵兵符, 武将_陶谦},
{宝物_锦帆军兵符, 武将_甘宁},
{宝物_白耳军兵符, 武将_陈到},
{宝物_羌骑兵兵符, 武将_羌头目},
{宝物_乌丸兵兵符, 武将_乌丸头目},
{宝物_匈奴兵兵符, 武将_乌丸头目},
{宝物_蛮族兵兵符, 武将_南蛮头目},
{宝物_巨象兵兵符, 武将_朵思大王},
{宝物_藤甲兵兵符, 武将_兀突骨},
{宝物_虎豹骑兵符, 武将_曹纯},
{宝物_青州兵兵符, 武将_曹操},
{宝物_山越兵兵符, 武将_山越头目},
{宝物_五溪蛮族兵符, 武将_沙摩柯},
{宝物_白马义从兵符, 武将_公孙瓒},
{宝物_铁车兵兵符, 武将_郭淮},
{宝物_青骢马, 武将_孙坚},
{宝物_灰影, 武将_张辽},
{宝物_白雪, 武将_郭嘉},
{宝物_黑云, 武将_周泰},
{宝物_奔雷, 武将_张郃},
{宝物_乌孙, 武将_司马懿},
{宝物_乌骓, 武将_魏延},
{宝物_白鸽, 武将_陆逊},
{宝物_燎原火, 武将_黄忠},
{宝物_萌, 武将_周瑜},
{宝物_黄骠马, 武将_秦琼},
{宝物_乌骓2, 武将_项藉},
{宝物_白龙驹, 武将_岳飞},
{宝物_汗血, 武将_马岱},
{宝物_虎豹铁骑, 武将_曹仁},
{宝物_莽牛, 武将_孟获},
{宝物_大象, 武将_木鹿大王},
{宝物_惊帆, 武将_曹真},
{宝物_白鹄, 武将_曹洪},
{宝物_紫骍, 武将_曹植},
{宝物_木牛流马, 武将_诸葛亮},
{宝物_骅骝, 武将_徐晃},
{宝物_乌云踏雪, 武将_张飞},
{宝物_快航, 武将_孙权},
{宝物_四轮车, 武将_诸葛亮},
{宝物_照夜玉狮子, 武将_赵云},
{宝物_卷毛赤兔马, 武将_祝融},
{宝物_里飞沙, 武将_马超},
//{宝物_大宛马4, 武将_许褚},
//{宝物_大宛马5, 武将_徐晃},
//{宝物_大宛马6, 武将_夏侯惇},
//{宝物_大宛马7, 武将_夏侯渊},
{宝物_论语集解, 武将_何晏},
{宝物_典论, 武将_曹丕},
{宝物_博弈论, 武将_韦昭},
{宝物_时要论, 武将_王基},
{宝物_治论, 武将_王昶},
{宝物_辩道论, 武将_曹植},
{宝物_乾象历注, 武将_阚泽},
{宝物_孝经传, 武将_严畯},
{宝物_仇国论, 武将_谯周},
{宝物_西蜀地形图, 武将_张松},
{宝物_平蛮指掌图, 武将_吕凯},
{宝物_济河论, 武将_邓艾},
{宝物_八阵总述, 武将_马隆},
{宝物_古锭刀, 武将_孙策},
{宝物_绿沉枪, 武将_姜维},
{宝物_铁蒺藜骨朵, 武将_沙摩柯},
{宝物_紫电, 武将_孙权},
{宝物_虎头湛金枪, 武将_马超},
{宝物_涯角枪, 武将_赵云},
{宝物_钢长刀, 武将_许褚},
{宝物_鬼神, 武将_项藉},
{宝物_沥泉枪, 武将_岳飞},
{宝物_连弩, 武将_诸葛亮},
{宝物_万石弓, 武将_黄忠},
{宝物_白羽扇, 武将_诸葛亮}
	};
}
